package com.mall.module.system.mapper;

import com.mall.module.system.domain.entity.SysDept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 部门数据访问层
 */
@Mapper
public interface SysDeptMapper {
    
    /**
     * 插入部门
     * @param dept 部门信息
     */
    void insert(SysDept dept);
    
    /**
     * 根据ID查询部门
     * @param id 部门ID
     * @return 部门信息
     */
    SysDept selectById(@Param("id") Long id);
    
    /**
     * 根据ID查询部门（包含父部门信息）
     * @param id 部门ID
     * @return 部门信息
     */
    SysDept selectByIdWithParent(@Param("id") Long id);
    
    /**
     * 查询所有部门
     * @return 部门列表
     */
    List<SysDept> selectAll();
    
    /**
     * 根据父部门ID查询子部门
     * @param parentId 父部门ID
     * @return 子部门列表
     */
    List<SysDept> selectByParentId(@Param("parentId") Long parentId);
    
    /**
     * 查询部门树形结构
     * @return 部门树形列表
     */
    List<SysDept> selectDeptTree();
    
    /**
     * 根据条件查询部门
     * @param dept 查询条件
     * @return 部门列表
     */
    List<SysDept> selectByCondition(SysDept dept);
    
    /**
     * 更新部门信息
     * @param dept 部门信息
     */
    void updateById(SysDept dept);
    
    /**
     * 更新部门状态
     * @param id 部门ID
     * @param status 状态
     * @param updaterId 更新人ID
     */
    void updateStatus(@Param("id") Long id, @Param("status") Integer status, @Param("updaterId") Long updaterId);
    
    /**
     * 更新部门排序
     * @param id 部门ID
     * @param orderNum 排序号
     * @param updaterId 更新人ID
     */
    void updateOrderNum(@Param("id") Long id, @Param("orderNum") Integer orderNum, @Param("updaterId") Long updaterId);
    
    /**
     * 批量更新部门排序
     * @param deptOrders 部门排序列表
     */
    void batchUpdateOrderNum(@Param("deptOrders") List<SysDept> deptOrders);
    
    /**
     * 逻辑删除部门
     * @param id 部门ID
     * @param updaterId 删除人ID
     */
    void deleteById(@Param("id") Long id, @Param("updaterId") Long updaterId);
    
    /**
     * 检查部门名称是否存在
     * @param name 部门名称
     * @param parentId 父部门ID
     * @param excludeId 排除的部门ID
     * @return 是否存在
     */
    boolean existsByName(@Param("name") String name, @Param("parentId") Long parentId, @Param("excludeId") Long excludeId);
    
    /**
     * 检查部门编码是否存在
     * @param deptCode 部门编码
     * @param excludeId 排除的部门ID
     * @return 是否存在
     */
    boolean existsByDeptCode(@Param("deptCode") String deptCode, @Param("excludeId") Long excludeId);
    
    /**
     * 统计部门下的用户数量
     * @param deptId 部门ID
     * @return 用户数量
     */
    int countUsersByDeptId(@Param("deptId") Long deptId);
    
    /**
     * 查询部门的所有子部门ID
     * @param deptId 部门ID
     * @return 子部门ID列表
     */
    List<Long> selectChildDeptIds(@Param("deptId") Long deptId);
    
    /**
     * 查询部门的层级路径
     * @param deptId 部门ID
     * @return 层级路径
     */
    String selectDeptPath(@Param("deptId") Long deptId);
    
    /**
     * 更新子部门的父部门ID
     * @param oldParentId 原父部门ID
     * @param newParentId 新父部门ID
     * @param updaterId 更新人ID
     */
    void updateChildrenParentId(@Param("oldParentId") Long oldParentId, @Param("newParentId") Long newParentId, @Param("updaterId") Long updaterId);

    /**
     * 根据部门ID查询部门信息
     * 
     * @param deptId 部门ID
     * @return 部门信息
     */
    SysDept selectDeptById(@Param("deptId") Long deptId);
}
